package com.zp.self.module.level_4_算法练习.数学.位运算;
import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_1009_十进制整数的反码 {
    @Test
    public void main() {
        
        Solution solution = new 力扣_1009_十进制整数的反码().new Solution();
        System.out.println(solution);
    }

    /**
     题目：每个非负整数 N 都有其二进制表示。例如， 5 可以被表示为二进制 "101"，11 可以用二进制 "1011" 表示，依此类推。注意，除 N = 0 外，任何二进制表示中都不含前导零。
         二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如，二进制数 "101" 的二进制反码为 "010"。
         给你一个十进制数 N，请你返回其二进制表示的反码所对应的十进制整数。

         示例 1：
         输入：5
         输出：2
         解释：5 的二进制表示为 "101"，其二进制反码为 "010"，也就是十进制中的 2 。

         示例 2：
         输入：7
         输出：0
         解释：7 的二进制表示为 "111"，其二进制反码为 "000"，也就是十进制中的 0 。

         示例 3：
         输入：10
         输出：5
         解释：10 的二进制表示为 "1010"，其二进制反码为 "0101"，也就是十进制中的 5 。

     分析：【P 💖💖】
        1.取反:找到n的最大位,与全为1的数取反
                --执行耗时:0 ms,击败了100.00% 的Java用户
                --编码耗时:[15:45]

     边界值 & 注意点：
        1.
     **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int bitwiseComplement(int n) {
        if(n==0) return 1;
        int fan = 0,init=n;
        while (n>0){
            n= n>>1;
            fan= (fan<<1)+1;
        }
        return init^fan;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}